package controlador;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import datos.AccionesCliente;
import datos.AccionesDetalleVenta;
import datos.AccionesProducto;
import datos.AccionesRegistroPago;
import datos.AccionesTipoPago;
import datos.AccionesUsuario;
import datos.AccionesVenta;
import datos.Cliente;
import datos.DetalleCuenta;
import datos.DetalleVenta;
import datos.Producto;
import datos.RegistroPago;
import datos.Usuario;
import datos.Venta;

/**
 * Servlet implementation class RegistrarVenta
 */
public class RegistrarVenta extends HttpServlet {
	private static final long serialVersionUID = 1L;
    private boolean entro;
    /**
     * @see HttpServlet#HttpServlet()
     */
    public RegistrarVenta() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession sesion=request.getSession();
		String user=(String)sesion.getAttribute("user");
		String pass=(String)sesion.getAttribute("pass");
		Usuario u=new Usuario(user, pass);
		String r=AccionesUsuario.reemplazar(this.getClass().getSimpleName());
		if(AccionesUsuario.validarUsuario(u)){
			if(AccionesUsuario.validarPermiso(u, r)){
			String idProducto=request.getParameter("idProducto");
			String idComparar=null;
			ArrayList<Producto> productos=(ArrayList<Producto>)sesion.getAttribute("listaProductos");
			for(int i=0; i<productos.size(); i++){
				idComparar=productos.get(i).getIdProducto();
				if(idProducto.equals(idComparar)){
					productos.remove(i);
				}
			}
			sesion.setAttribute("listaProductos", productos);
			response.sendRedirect("agregarProductosVenta.jsp");
			}else{
				response.sendRedirect("index.jsp");
			}
		}else{
			response.sendRedirect("login.jsp");
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession sesion=request.getSession();
		String user=(String)sesion.getAttribute("user");
		String pass=(String)sesion.getAttribute("pass");
		Usuario u=new Usuario(user, pass);
		String r=AccionesUsuario.reemplazar(this.getClass().getSimpleName());
		if(AccionesUsuario.validarUsuario(u)){
			if(AccionesUsuario.validarPermiso(u, r)){
			String submit=request.getParameter("submit");
			
			switch(submit){
			case "Agregar Productos":
				String idVentaStr=request.getParameter("idVenta");
				if(idVentaStr==null){
					int idTipoVenta=Integer.parseInt(request.getParameter("idTipoVenta"));
					int maxIdVenta=AccionesVenta.getMaxNumFactura(idTipoVenta);
					int idVenta=maxIdVenta+1;
					int idCliente=Integer.parseInt(request.getParameter("idCliente"));
					int idTipoPago=Integer.parseInt(request.getParameter("idTipoPago"));
					sesion.setAttribute("idVenta", idVenta);
					int cantidadPagos=0;
					if(request.getParameter("cantidadPagos")!=null && request.getParameter("cantidadPagos")!=""){
						cantidadPagos=Integer.parseInt(request.getParameter("cantidadPagos"));
					}
					
					sesion.setAttribute("idCliente", idCliente);
					sesion.setAttribute("idTipoVenta", idTipoVenta);
					sesion.setAttribute("idTipoPago", idTipoPago);
					sesion.setAttribute("cantidadPagos", cantidadPagos);
					ArrayList<Producto> productos=new ArrayList<Producto>();
					sesion.setAttribute("listaProductos",productos);
					sesion.setAttribute("errorIdVentaExiste", false);
					response.sendRedirect("agregarProductosVenta.jsp");
				}else{
					int idVenta=Integer.parseInt(idVentaStr);
					int idTipoVenta=Integer.parseInt(request.getParameter("idTipoVenta"));
					//int maxIdVenta=AccionesVenta.getMaxNumFactura(idTipoVenta);
					int idCliente=Integer.parseInt(request.getParameter("idCliente"));
					int idTipoPago=Integer.parseInt(request.getParameter("idTipoPago"));
				if(AccionesVenta.getOne(idVenta, idTipoVenta)==null){
					sesion.setAttribute("idVenta", idVenta);
					int cantidadPagos=0;
					if(request.getParameter("cantidadPagos")!=null && request.getParameter("cantidadPagos")!=""){
						cantidadPagos=Integer.parseInt(request.getParameter("cantidadPagos"));
					}
					
					sesion.setAttribute("idCliente", idCliente);
					sesion.setAttribute("idTipoVenta", idTipoVenta);
					sesion.setAttribute("idTipoPago", idTipoPago);
					sesion.setAttribute("cantidadPagos", cantidadPagos);
					//System.out.println("idTipoPago: "+idTipoPago);
					ArrayList<Producto> productos=new ArrayList<Producto>();
					sesion.setAttribute("listaProductos",productos);
					sesion.setAttribute("errorIdVentaExiste", false);
					response.sendRedirect("agregarProductosVenta.jsp");
				}else{
					sesion.setAttribute("errorIdVentaExiste", true);
					response.sendRedirect("registrarVenta.jsp");
				}
				}
				break;
			case "Agregar":
				ArrayList<Producto> productos1=(ArrayList<Producto>)sesion.getAttribute("listaProductos");
				String idProducto=request.getParameter("idProducto");
				int cantidad=Integer.parseInt(request.getParameter("cantidad"));
				if(AccionesProducto.existIdProducto(idProducto)){
				if(AccionesProducto.stockProductoMenor(idProducto, cantidad)){
				
				Producto p=AccionesProducto.getOneById(idProducto);
				
				String desc=request.getParameter("descuento");
				String rec=request.getParameter("recargo");
				p.setCantidad(cantidad);
				if(desc!=null && desc!=""){
					double descuento=Double.parseDouble(desc);
					double precioParcial=p.getPrecio();
					double cantidadDesc=((descuento*precioParcial)/100);
					double precioFinal=precioParcial-cantidadDesc;
					p.setDescuentoVenta(descuento);
					p.setPrecio(precioFinal);
				}else if(rec!=null && rec!=""){
					double recargo=Double.parseDouble(rec);
					double precioParcial=p.getPrecio();
					double cantidadRec=((recargo*precioParcial)/100);
					double precioFinal=precioParcial+cantidadRec;
					p.setRecargoVenta(recargo);
					p.setPrecio(precioFinal);
				}
				
				if(!productos1.isEmpty()){
					boolean existeId=false;
					int posicion=0;
					Producto pArray=null;
					for(int i=0; i<productos1.size(); i++){
						if(productos1.get(i).getIdProducto().equals(p.getIdProducto())){
							existeId=true;
							posicion=i;
						}
					}
					if(existeId==true){
						pArray=productos1.get(posicion);
						pArray.setCantidad(pArray.getCantidad()+p.getCantidad());
						double sumaPreciosEx=(pArray.getPrecio()*(pArray.getCantidad()-p.getCantidad()));
						double sumaPreciosNu=(p.getPrecio()*p.getCantidad());
						double cantidadTotal=(pArray.getCantidad());
						double precioFinalCalculado=(sumaPreciosEx+sumaPreciosNu)/cantidadTotal;
						//System.out.println("sumaPreciosEx "+sumaPreciosEx);
						//System.out.println("sumaPreciosNu "+sumaPreciosNu);
						//System.out.println("cantidadTotal "+cantidadTotal);
						//System.out.println("precioFinal "+precioFinalCalculado);
						pArray.setPrecio(precioFinalCalculado);
						for(int i=0; i<productos1.size(); i++){
							if(productos1.get(i).getIdProducto().equals(p.getIdProducto())){
								productos1.remove(i);
								productos1.add(pArray);
							}
						}
						sesion.setAttribute("listaProductos", productos1);
						sesion.setAttribute("errorStockMenor", false);
						sesion.setAttribute("errorCodNoExiste", false);
						response.sendRedirect("agregarProductosVenta.jsp");
					}else{
						productos1.add(p);
						sesion.setAttribute("listaProductos", productos1);
						sesion.setAttribute("errorStockMenor", false);
						sesion.setAttribute("errorCodNoExiste", false);
						response.sendRedirect("agregarProductosVenta.jsp");
					}
				}else{
					productos1.add(p);
					sesion.setAttribute("listaProductos", productos1);
					sesion.setAttribute("errorStockMenor", false);
					sesion.setAttribute("errorCodNoExiste", false);
					response.sendRedirect("agregarProductosVenta.jsp");
				}
				
			
					
				
				

				}else{
					sesion.setAttribute("errorStockMenor", true);
					sesion.setAttribute("errorCodNoExiste", false);
					response.sendRedirect("agregarProductosVenta.jsp");
				}
				
				}else{
					sesion.setAttribute("errorCodNoExiste", true);
					response.sendRedirect("agregarProductosVenta.jsp");	
					}
				break;
			case "Finalizar Venta":
				ArrayList<Producto> productos2=(ArrayList<Producto>)sesion.getAttribute("listaProductos");
				if(productos2.isEmpty()){
					sesion.setAttribute("errorRegistrarVenta", true);
					sesion.setAttribute("exitoFinalizarVenta", false);
					response.sendRedirect("agregarProductosVenta.jsp");
				}else{
				int idVenta1=(Integer)sesion.getAttribute("idVenta");
				int idTipoVenta1=(Integer)sesion.getAttribute("idTipoVenta");
				int idTipoPago1=(Integer)sesion.getAttribute("idTipoPago");
				int idCliente1=(Integer)sesion.getAttribute("idCliente");
				double total=(Double)sesion.getAttribute("totalVenta");
				int cantidadPagos1=(Integer)sesion.getAttribute("cantidadPagos");
				Venta v=null;
				if(idTipoPago1>2){
					v=new Venta(idVenta1, null, idTipoPago1, idTipoVenta1, idCliente1, total);
					v.setCantidadPagos(cantidadPagos1);
				}else if(idTipoPago1 == 2){
				v=new Venta(idVenta1, null, idTipoPago1, idTipoVenta1, idCliente1, total);
				Cliente c = AccionesCliente.getClienteById(idCliente1);
				c.setSaldo(total);
				AccionesCliente.updateCliente(c);

				}else{
				v=new Venta(idVenta1, null, idTipoPago1, idTipoVenta1, idCliente1, total);
				}
				AccionesVenta.addVenta(v);
				
				
				for(int i=0; i<productos2.size(); i++){
					double subtotal=((productos2.get(i).getPrecio())*(productos2.get(i).getCantidad()));
					DetalleVenta dv=new DetalleVenta(idVenta1, productos2.get(i), productos2.get(i).getCantidad(),subtotal,productos2.get(i).getDescuentoVenta(), productos2.get(i).getRecargoVenta());
					dv.setIdTipoVenta((Integer)sesion.getAttribute("idTipoVenta"));
					AccionesDetalleVenta.addDetalleVenta(dv);
					AccionesProducto.updateProductoVenta(productos2.get(i));
				}
				if(idTipoPago1!=2){
					
					RegistroPago rp=new RegistroPago(idCliente1, idTipoPago1, total, null, "Venta "+AccionesTipoPago.getOne(idTipoPago1).getTipo());
					rp.setSaldoAnterior(total);
					AccionesRegistroPago.addRegistroPago(rp);
				}
				sesion.setAttribute("exitoFinalizarVenta", true);
				sesion.setAttribute("errorRegistrarVenta", false);
				response.sendRedirect("ventas.jsp");
				}
				break;
				
			}
			}else{
				response.sendRedirect("index.jsp");
			}
		}else{
			response.sendRedirect("login.jsp");
		}
	}

}

